#pragma once

// Dependencies
template<class T> class Vector2_t;
#include <iosfwd>

// Point2
// (Thomas Rippon) Represents a point in 2-dimensional space
template<class T>
class Point2_t {
public: // Typedefs
	typedef T value_type;
	typedef Point2_t<T> this_type;

public: // Constructors
	Point2_t();
	Point2_t( T x, T y );

public: // Operators
	const Vector2_t<T> operator - ( const Point2_t<T>& pt ) const;
	
	const Point2_t<T> operator + ( const Vector2_t<T>& vec ) const;
	Point2_t<T>& operator += ( const Vector2_t<T>& vec );
	
public: // Comparison operators
	bool operator == ( const Point2_t<T>& pt ) const;
	bool operator != ( const Point2_t<T>& pt ) const;
	bool operator < ( const Point2_t<T>& pt ) const;

public: // Methods
	Vector2_t<T> fromOrigin() const;

public: // Members
	T x, y;

public: // Static members
	static const Point2_t<T> origin;
};

typedef Point2_t<int> Point2i;
typedef Point2_t<double> Point2;
typedef Point2_t<float> Point2f;